package org.nf.db.util.converter;

import org.nf.db.util.TypeConverter;

import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * @author wangl
 * @date 2023/4/7
 */
public class LocalDateTimeConverter implements TypeConverter {


    /**
     * 判断是否适配LocalDateTime.class
     * @param fieldType
     * @return true or false
     */
    @Override
    public boolean supports(Class<?> fieldType) {
        return fieldType.equals(LocalDateTime.class);
    }

    /**
     *转换为localDateTime
     * @param fieldType 时间的class对象
     * @param value 时间类型
     * @return 返回转换的localDateTime对象 or null
     * 如果 value 是 LocalDateTime 类型，则直接返回它本身。
     * 如果 value 是 LocalDate 类型，则使用 atStartOfDay() 方法将其转换为当天开始时的 LocalDateTime。
     * 如果 value 是 LocalTime 类型，则使用当前日期（LocalDate.now()）与给定的时间组合成一个 LocalDateTime。
     * 如果 value 是 Date 类型（通常指 java.sql.Date），则首先将其转换为 LocalDate（注意这里可能丢失了时间信息），然后使用 atStartOfDay() 创建一个 LocalDateTime。
     * 如果 value 是 Timestamp 类型（通常指 java.sql.Timestamp），则直接调用 toLocalDateTime() 方法将其转换为 LocalDateTime。
     * 如果 value 是 Time 类型（通常指 java.sql.Time），则将其转换为 LocalTime，并与当前日期组合成一个 LocalDateTime。
     * 如果 value 不是上述任何类型，则返回 null。
     */
    @Override
    public Object apply(Class<?> fieldType, Object value) {

        return switch (value) {
            case LocalDateTime localDateTime -> localDateTime;
            case LocalDate localDate -> localDate.atStartOfDay();
            case LocalTime localTime -> localTime.atDate(LocalDate.now());
            case Date sqlDate -> sqlDate.toLocalDate().atStartOfDay();
            case Timestamp timestamp -> timestamp.toLocalDateTime();
            case Time time -> time.toLocalTime().atDate(LocalDate.now());
            default -> null;
        };
    }
}
